#include "stm32f10x.h"                  // Device header
#include "bsp_Led.h"
#include "usart.h"
#include "delay.h"
#include "bsp_ds18b20.h"
#include "beep.h"
#include "bsp_ili9341_lcd.h"
#include "bsp_exti.h"
#include "HC_05.h"
#include "MFRC522.h"
#include "string.h"
//#include "bsp_esp8266_test.h"
//#include "bsp_esp8266.h"
//#include "onenet.h"


/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "Task_Proper.h"
//温度
uint8_t uc, ucDs18b20Id [ 8 ];
float temperature=0.0;
float temperature_v=31.50;

//lCD缓冲区
char dis_buf[1024];

//控制灯的状态
uint8_t Gled_Flag=0;

//控制门的状态
uint8_t Door_Flag=0;
//RC522门
unsigned char buf[20];  //存放卡序号
unsigned char bufPSW[20]={0xfc,0xb9,0x90,0x02};

//esp
u8 esp_rx_flag=0;


static void STM32F1_Init(void);

int main(){
	BaseType_t xReturn = pdFAIL;/* 定义一个创建信息返回值，默认为pdPASS */
	STM32F1_Init();
//	ESP8266_Init ( ); 
//	ESP8266_StaTcpServer_ConfigTest(); //对ESP8266进行配置 AP模式
	
	xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  /* 任务入口函数 */
                        (const char*    )"AppTaskCreate",/* 任务名字 */
                        (uint16_t       )128,  /* 任务栈大小 */
                        (void*          )NULL,/* 任务入口函数参数 */
                        (UBaseType_t    )1, /* 任务的优先级 */
                        (TaskHandle_t*  )&AppTaskCreate_Handle);/* 任务控制块指针 */ 
												
	/* 启动任务调度 */           
  if(pdPASS == xReturn){
		printf("\r\n开启调度\r\n");
    vTaskStartScheduler();   /* 启动任务，开启调度 */
	}
  else
    return -1;  
	while(1){
		
	}
	
}

static void AppTaskCreate(void){
	BaseType_t xReturn = pdFAIL;/* 定义一个创建信息返回值，默认为pdPASS */
  
  taskENTER_CRITICAL();           //进入临界区
	
	/* 创建Temp_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )Temp_Task, /* 任务入口函数 */
                        (const char*    )"Temp_Task",/* 任务名字 */
                        (uint16_t       )128,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )4,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&Temp_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("\r\nTemp_Task任务成功\r\n");
	
	/* 创建Exti_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )Exti_Task, /* 任务入口函数 */
                        (const char*    )"Exti_Task",/* 任务名字 */
                        (uint16_t       )128,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )3,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&Exti_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("\r\nExti_Task任务成功\r\n");
	/* 创建LCD_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )LCD_Task, /* 任务入口函数 */
                        (const char*    )"LCD_Task",/* 任务名字 */
                        (uint16_t       )128,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )4,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&LCD_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("\r\nLCD_Task任务成功\r\n");
	
	/* 创建RC522_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )RC522_Task, /* 任务入口函数 */
                        (const char*    )"RC522_Task",/* 任务名字 */
                        (uint16_t       )128,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )3,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&RC522_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("\r\nRC522_Task任务成功\r\n");
	


	
	
	vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
  
  taskEXIT_CRITICAL();            //退出临界区
}

void RC522_Task(void* pvParameters){
	unsigned char status;		//返回符
	while(1){
		status = MFRC522_Request(PICC_REQALL, buf);//寻卡
			if (status != MI_OK)
			{    

					printf("\r\n寻卡失败\r\n");
					MFRC522_Reset();
					MFRC522_AntennaOff(); 
					MFRC522_AntennaOn(); 
					continue;
			}
		
			status = MFRC522_Anticoll(buf);//防冲突
			if (status != MI_OK)
			{    
						continue;    
			}
			if(strncmp((const char*)bufPSW, (const char*)buf,4)==0){
				Door_Flag=1;
			}
			vTaskDelay(500);

	}
}

void LCD_Task(void* pvParameters){
	while(1){
		sprintf((char*)dis_buf," temperature:%0.3f ",temperature);
		ILI9341_DispStringLine_EN(LINE(4),dis_buf);
		if(temperature>temperature_v){
			sprintf((char*)dis_buf," temperature: overtop!!! ");
			ILI9341_DispStringLine_EN(LINE(5),dis_buf);
		}
		else{
			sprintf((char*)dis_buf," temperature: normal     ");
			ILI9341_DispStringLine_EN(LINE(5),dis_buf);
		}
		
		if(Gled_Flag==0){
			sprintf((char*)dis_buf," LED: OFF ");
			ILI9341_DispStringLine_EN(LINE(6),dis_buf);
		}
		else{
			sprintf((char*)dis_buf," LED: ON ");
			ILI9341_DispStringLine_EN(LINE(6),dis_buf);
			
		}
		
		if(Door_Flag==0){
			sprintf((char*)dis_buf," DOOR: CLOSE ");
			ILI9341_DispStringLine_EN(LINE(7),dis_buf);
		}
		else{
			sprintf((char*)dis_buf," DOOR: OPEN ");
			ILI9341_DispStringLine_EN(LINE(7),dis_buf);
			
		}
		vTaskDelay(1000);
	}
}
void Exti_Task(void* pvParameters){
	while(1){
		if(Gled_Flag==0){
			LED2_OFF;
		}
		else{
			LED2_ON;
		}
		if(Door_Flag==0){
			LED3_OFF;
		}
		else{
			LED3_ON;
		}
		vTaskDelay(500);
	}
}

void Temp_Task(void* pvParameters){	
	
    while (1)
    {
      temperature=DS18B20_GetTemp_MatchRom ( ucDs18b20Id );//这里不能用时间片来切换，不然读不出来，把它优先级提高不被打断
			if(temperature>temperature_v){
				LED1_ON;
				beep1;
			}
		else{
			LED1_OFF;
			beep0;
			}
			vTaskDelay(20);
    }
}



static void STM32F1_Init(void){
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	SystemInit();//配置系统时钟为72M，加不加这行代码都是默认72M，但是可以去这个函数里面修改M
	delay_init();
	USART1_Config();
	LED_GPIO_Config();
	DS18B20_Init(  );
	DS18B20_ReadId ( ucDs18b20Id );
	BEEP_GPIO_Config();
	ILI9341_Init (); 	 //初始化LCD
	ILI9341_GramScan ( 6 );
	ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);//清屏
	EXTI_Key_Config();
	USART2_Init(9600);	
	MFRC522_Init();
	MFRC522_Reset ();
	ILI9341_DispStringLine_EN(LINE(2),"    wellcome to smarthome");
}
